home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
source
/
swags-z
/
sorting.swg
/
0018_QUICK4.PAS.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-05-28
|
2KB
|
76 lines
Unit qsort;
Interface
Procedure quicksort(Var s; left,right : Word);
Implementation
Procedure quicksort(Var s; left,right : Word; SortType: sType);
{ On the first call left should always be = to min and right = to max }
Var
data : DataArr Absolute s;
pivotStr,
tempStr : String;
pivotLong,
tempLong : LongInt
lower,
upper,
middle : Word;
Procedure swap(Var a,b);
Var x : DirRec Absolute a;
y : DirRec Absolute b;
t : DirRec;
begin
t := x;
x := y;
y := t;
end;
begin
lower := left;
upper := right;
middle:= (left + right) div 2;
Case SortType of
_name: pivotStr := data[middle].name;
_ext : pivotStr := data[middle].ext;
_size: pivotLong := data[middle].Lsize;
_date: pivotLong := data[middle].Ldate;
end; { Case SortType }
Repeat
Case SortType of
_name: begin
While data[lower].name < pivotStr do inc(lower);
While pivotStr < data[upper].name do dec(upper);
end;
_ext : begin
While data[lower].ext < pivotStr do inc(lower);
While pivotStr < data[upper].ext do dec(upper);
end;
_size: begin
While data[lower].Lsize < pivotLong do inc(lower);
While pivotLong < data[upper].Lsize do dec(upper);
end;
_date: begin
While data[lower].Ldate < pivotLong do inc(lower);
While pivotLong < data[upper].Ldate do dec(upper);
end;
end; { Case SortType }
if lower <= upper then begin
swap(data[lower],data[upper]);
inc(lower);
dec(upper);
end;
Until lower > upper;
if left < upper then quicksort(data,left,upper);
if lower < right then quicksort(data,lower,right);
end; { quicksort }